<?php
namespace app\system\controller;
use think\Session;
use think\db;
use app\admin\common\Base;

//数据备份与回复
class Backup extends Base
{
    public function index()
    {
        $data = $this->request->param();
        if (isset($data['ajax']) && $data['ajax'] == 100) {//ajax不为空 且 等于100时输出的内容
            $map='';                                    //给$map赋值为空
            $page=isset($data['page'])?$data['page']:1; //是否有第几页有就返回本身不然就返回1赋值给$page
            $page=intval($page);                        //获取变量的整数值
            $limit=isset($data['rows'])?$data['rows']:10;//是否有多少条数有就返回本身不然就返回10赋值给$limit
            $limit=intval($limit);              //获取变量的整数值
            $start=$limit*($page-1);//0
            //数据库导出功能
                if($map==''){   //$map为空时输出的内容
                $list =Db::name('backup')->where('is_del',0)->where('enterprise_id',$this->EnterpriseId)->order('id desc')->limit($start,$limit)->select();
                //查询日志表条件1查看表是否删除条件2企业ID等于企业ID倒序长度不超过获取到的种条数查询所有
                $count =Db::name('backup')->where('is_del',0)->where('enterprise_id',$this->EnterpriseId)->count();
                //获取到查询日志表的总条数
                    foreach($list as $k => $timi){//循环日志表输出的内容
                        // $list[$k]['check_cdate']=date('Y-m-d',$timi['check_cdate']);//获取到的日志时间搓转换为日期格式赋值给时间
                        $list[$k]['time']=date('Y-m-d',$timi['time']);//获取到的日志时间搓转换为日期格式赋值给时间         
                    }
                }   
                return $this->grid_data($list,$count,$page,$limit);//返回查询到的结果，查询到结果的种条数，页数，条数给grid
        }
        return $this->fetch();
    }
    //数据库导入 恢复功能
    public function hf(){
        $data = $this->request->param();
        if (isset($data['id'])) {
            $li=db('backup')->where('id',$data['id'])->find();
            $fp = fopen($li['lj'],"r");
            $str = fread($fp,filesize($li['lj']));//指定读取大小，这里把整个文件内容读取出来
            // $sql = file_get_contents($li['lj']);//读取文件
            $a=explode(";\r\n",$str);
            // $a= str_replace("'\'","'/'",$a);
            foreach($a as $b){ //遍历数组
                $c=$b.";"; //分割后是没有“;”的，因为SQL语句以“;”结束，所以在执行SQL前把它加上
                $smq=Db::query($c); //执行SQL语句
            }
            //恢复执行成功返回的数据
            if (empty($smq)) {
                return json(['code'=>1,'msg'=>'恢复成功']);
            }else{
                return json(['code'=>2,'msg'=>'失败失败']);
            }
        }
    }
    public function del(){
        $data = $this->request->param();
        //alld存在时 是 当行删除  不存在是多选删除
        if (isset($data['alld'])) {
            $del=db('backup')->where('id',$data['del'])->setField('is_del',1);
            //删除成功时 输出的数据
            if ($del) {
                return json(['code'=>1,'msg'=>'删除成功']);
            }else{
                return json(['code'=>2,'msg'=>'删除失败']);
            }
        //批量删除时输出的内容
        }else{
            $alld=$data['del'];
            foreach($alld as $k){
                $del=db('backup')->where('id',$k)->setField('is_del',1);
            }
            if ($del) {
                return json(['code'=>1,'msg'=>'删除成功']);
            }else{
                return json(['code'=>2,'msg'=>'删除失败']);
            }
        }
    }
    //备份开始
    public function bf(){
        $data = $this->request->param();
        if(isset($data['bf'])){
                //1.获取数据库信息
                $info = Db::getConfig();
                $dbname = $info['database'];
                //2.获取数据库所有表
                $tables = Db::query("show tables");
                //3、组装头部信息
                header("Content-type:text/html;charset=utf-8");
                $path = ROOT_PATH.'public\data/';
                $database = $dbname;   //获取当前数据库
                $info  = "-- ----------------------------\r\n";
                $info .= "-- 日期：".date("Y-m-d H:i:s",time())."\r\n";
                $info .= "-- MySQL - 5.5.52-MariaDB : Database - ".$database."\r\n";
                $info .= "-- ----------------------------\r\n\r\n";
                $info .= "SET NAMES utf8;\r\nSET FOREIGN_KEY_CHECKS = 0;\r\n\r\n";
                //4、检查目录是否存在
                if (is_dir($path)) {
                    if (is_writable($path)) {
                    } else {
                        echo '目录不可写'; exit();
                    }
                } else {
                    mkdir($path,0777,true);
                }
                //5、保存的文件名称
                $file_name = $path.$database.'_'.date('Ymd_His').'.sql';
                file_put_contents($file_name, $info, FILE_APPEND);//保存文件名字
                foreach ($tables as $k => $v) {
                    $val = $v["Tables_in_$database"];//数据表名称
                    $sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='$val' AND TABLE_SCHEMA='$dbname'";//源生SQL
                    $res = Db::query($sql);//执行源生语句
                    $max_num = Db::table("$val")->order('id desc')->value('id');//获取每张表ID
                    if ($max_num==null) {
                        $max_num=0;//表为空就给他赋值0
                    }
                    //查询表结构
                    $info_table = "-- ----------------------------\r\n";
                    $info_table .= "-- Table structure for `$val`\r\n";
                    $info_table .= "-- ----------------------------\r\n\r\n";
                    $info_table .= "DROP TABLE IF EXISTS `$val`;\r\n";
                    if (!count($res)){
                        continue;//跳出查询数据为空的
                    }
                    $info_table .= "CREATE TABLE `$val` (\n\r\t";//写入 的表名称
                    foreach ($res as $kk => $vv) {
                        $info_table .= " `".$vv['COLUMN_NAME']."` ";//写入字段名
                        $info_table .= $vv['COLUMN_TYPE'];//写入 类型
                        $mr=$vv['COLUMN_DEFAULT'];//默认值 赋值给mr  
                        //判断主键
                        if ($vv['EXTRA']) {
                            $info_table .= " AUTO_INCREMENT";
                            $key = $vv['COLUMN_NAME'];
                        }else{
                            $key='id';//主键不存在给它赋ID  
                        }
                        //编码
                        if ($vv['CHARACTER_SET_NAME']) {
                            $info_table .= " CHARACTER SET ".$vv['CHARACTER_SET_NAME'];
                        }
                        //字符集
                        if ($vv['COLLATION_NAME']) {
                            $info_table .= " COLLATE ".$vv['COLLATION_NAME'];
                        }
                        //是否允许空值
                        if($vv['DATA_TYPE']=='text'){
                            $info_table .= " NULL";//text类型的 默认值为null
                        }else{
                            if ($vv['IS_NULLABLE'] == 'NO') {
                                $info_table .= " NOT NULL";//不为空时输出的内容
                                if ($vv['EXTRA']) {//主键不写入默认值
                                }else{
                                    if (empty($vv['COLUMN_DEFAULT'])) {//默认值为空 就给它写死
                                        if ($vv['DATA_TYPE']=='varchar'){
                                            $info_table .= " DEFAULT "."''";//varchar类型的默认值''
                                        }else{
                                            if ($vv['DATA_TYPE']=='int') {
                                                $info_table .= " DEFAULT ".'0';//int类型的默认值为0
                                            }
                                        }
                                    }else{
                                        $info_table .= " DEFAULT ".$vv['COLUMN_DEFAULT'];//如果有默认值就给他赋值
                                    }    
                                }
                            }else{
                                $info_table .= " NULL";//可以为空时输出的内容
                                if ($vv['EXTRA']) {
                                }else{
                                    if (empty($vv['COLUMN_DEFAULT'])) {//如果默认值为空给他赋值
                                        if ($vv['DATA_TYPE']=='int' || $vv['DATA_TYPE']=='text') {
                                            $info_table .= " DEFAULT ".'NULL';//int 和 text类型的默认值为NULL
                                        }elseif($vv['DATA_TYPE']=='tinyint'){
                                            $info_table .= " DEFAULT "."0";//tinyint类型默认值 为0
                                        }elseif($vv['DATA_TYPE']=='varchar'){
                                            $info_table .= " DEFAULT "."''";//varchar类型默认值 为''
                                        }else{
                                            $info_table .= " DEFAULT ".$vv['COLUMN_DEFAULT'];//其他的默认值赋值    
                                        } 
                                    }else{
                                        $info_table .= " DEFAULT ".$vv['COLUMN_DEFAULT'];//如果默认值存在在给他赋值
                                    }
                                }
                            }    
                        }
                        //没打备注添加,
                        if ($vv['COLUMN_COMMENT']==null) {
                            $info_table .=",";//没有备注就给他结束
                        }
                        //注释
                        if ($vv['COLUMN_COMMENT']) {
                            $sv= str_replace(";",",",$vv['COLUMN_COMMENT']);//;符号改为,
                            $info_table .= " COMMENT '".$sv."',\n\r\t";//注释赋值
                        }
                    }
                    $info_table .= " PRIMARY KEY (`$key`) USING BTREE";//主键的字段
                    $info_table .= "\n\r) ENGINE = MyISAM AUTO_INCREMENT $max_num CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\r\n\r\n";//表结束
                    //查询表数据
                    $info_table .= "-- ----------------------------\r\n";
                    $info_table .= "-- Data for the table `$val`\r\n";
                    $info_table .= "-- ----------------------------\r\n\r\n";
                    file_put_contents($file_name,$info_table,FILE_APPEND);//追加写入文件
                    $sql_data = "select * from $val";//源生SQL
                    $data = Db::query($sql_data);//加载源生
                    $count= count($data);//长度
                    if ($count==0){ //如果查询没有值就给他结束
                        continue;
                    }
                    foreach ($data as $key => $value) {
                        //写入表中的数据 sql结构
                        $sqlStr = "INSERT INTO `$val` VALUES (";
                        foreach($value as $v_d){
                            $v_d = str_replace("'","\'",$v_d);
                            $v_d = str_replace("';'","','",$v_d);//内容中的;全部改为,
                            $v_d = str_replace("\\","/",$v_d);//\改为/
                            // $v_d = stripslashes($v_d);
                            if ($v_d==null) {
                            $sqlStr .= "'0'".", ";//如果值为空时给他填充0
                            }else{
                            $sqlStr .= "'".$v_d."', ";//写入表中的内容
                            }
                        }
                    $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);//返回字符串
                    $sqlStr .= ");\r\n";//结束换行
                    file_put_contents($file_name,$sqlStr,FILE_APPEND);//循环追加写入文件
                    }
                    $info = "\r\n";//换行
                    file_put_contents($file_name,$info,FILE_APPEND);
                }
                $wj = "\r\nSET FOREIGN_KEY_CHECKS = 1".";";//外键结束
                file_put_contents($file_name,$wj,FILE_APPEND);//写入文件
                $fCont = file_get_contents($file_name);//文件大小
                $srele=strlen($fCont);//获取文件大小
                $str=explode("/",$file_name);//获取文件名字
                $str=$str[1];
                $lj='public/data/'.$str;
                $sess=Session::get('user_info');
                // dump($sess);exit();
                $da=[
                    'name'=>$str,
                    'cont'=>$srele,
                    'time'=>time(),
                    'lj'=>$lj,
                    'enterprise_id'=>$sess['enterprise_id'],
                ];
                $back=Db::table('t_backup')->insert($da);//插入数据库
                if ($back) {//插入成功输出的内容
                    return json(['code'=>1,'msg'=>'备份成功']);
                }else{
                    return json(['code'=>2,'msg'=>'备份失败']);
                }
                // 数据库导出功能结束
            }
    }
    //文件上传
    public function sc(){
        $file = request()->file('file');//获取文件
        if($file){
        $info = $file->move(ROOT_PATH . 'public' . DS . 'data');//保存文件地址
        if($info){
            $size=$info->getInfo();//获取文件基本信息
            $lj='public/data/'.$info->getSaveName();//给路径赋值
            $name=$info->getFilename();//给文件名赋值
            $sess=Session::get('user_info');
            $da=[
                'name'=>$name,
                'cont'=>$size['size'],
                'time'=>time(),
                'lj'=>$lj,
                'enterprise_id'=>$sess['enterprise_id'],
            ];
            $back=Db::table('t_backup')->insert($da);//插入数据库
            if ($back) {//插入成功输出的内容
                return json(['code'=>1,'msg'=>'备份成功']);
            }else{
                return json(['code'=>2,'msg'=>'备份失败']);
            }
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }

    }

   

}
